class Solution {
    public int[] searchRange(int[] nums, int target) {
        int[] ans = {-1, -1};
        if (nums.length == 0) { // 排除特殊情况
            return ans;
        }
        // 找左端点
        int left = 0;
        int right = nums.length - 1;
        while (left < right) {
            int mid = left + (right - left) / 2; // 找靠左的位置
            if (nums[mid] >= target) {
                right = mid; // 保证在合法区域内
            } else {
                left = mid + 1; // 保证有可能跳出非法区域
            }
        }
        // 走到这里，说明left与right相遇了
        if (nums[left] == target) { // 判断是否为左端点
            ans[0] = left; // left 与 right 都是可以的
        } else { // 说明数组中没有要找的数据
            return ans;
        }
        // 找右端点
        left = 0;
        right = nums.length - 1;
        while (left < right) {
            int mid = left + (right - left + 1) / 2; // 找靠右的位置
            if (nums[mid] <= target) {
                left = mid; // 保证在合法区域内
            } else {
                right = mid - 1; // 保证有可能跳出非法区域
            }
        }
        // 走到这里，说明left与right相遇了，无需判断，既然有左端点，肯定有右端点
        ans[1] = right; // left 与 right 都是可以的
        return ans;
    }
}